#include <iostream>
#include <unistd.h>
#include <pthread.h>

// 1. main函数结束，代表主线程结束，一般也代表进程结束
// 2. 新线程对应的入口函数，运行结束，代表当前线程运行结束

// 3. 一个问题，给线程传递的参数和返回值，可以是任意类型（包括对象）

class Task
{
public:
    Task(int a, int b) : _a(a), _b(b) {}
    ~Task() {}

    int Execute() { return _a + _b; }

private:
    int _a;
    int _b;
};

class Result
{
public:
    Result(int res) : _res(res) {}
    ~Result() {}

    int GetResult() { return _res; }

private:
    int _res;
};

// 线程终止的问题
// 1. 线程的入口函数，进行return就是线程终止
// 注意：线程不能用exit()终止，因为exit是终止进程的！！！！！
// 2. pthread_exit();
// 3.pthread_cancel();
// 注意：线程如果被取消，退出结果是-1[PTHREAD_CANCELED]

void *routine(void *args)
{
    Task *t = static_cast<Task *>(args);
    sleep(100);
    Result *res = new Result(t->Execute());
    sleep(1);
    // return res;
    pthread_exit(res);
    std::cout << "haha，新线程不应该看到这里" << std::endl;
}

//如果主线程不想再关心新线程，而是当新线程结束的时候，让它自己释放？？

int main()
{
    pthread_t tid;
    Task *t = new Task(1, 2);
    pthread_create(&tid, nullptr, routine, t);

    // Result *ret = nullptr;
    // pthread_join(tid, (void **)&ret);
    // int n = ret->GetResult();
    // std::cout << "新线程结束，运行结果是：" << n << std::endl;

    // delete t;
    // delete ret;

    sleep(3);
    pthread_cancel(tid);

    void* ret = nullptr;
    //默认线程无异常
    pthread_join(tid, &ret);//拿到的返回值，就是线程退出设定的返回值
    std::cout << "新线程结束，运行结果是：" << (long long)ret << std::endl;

    return 0;
}